
第二版的蒙古照片精選出來,我看完的第一個感覺是人物太多了。自拍一張接一張,把精選名額吃掉不少。
我記得我的分類是大景/人物/食物/細節/其他,那就調吧。我給了很具體的數據指令:
V2 的確比 V1 有人味一點。但人物 1.25 的確太高,以蒙古行程的特質,我會希望大景 +25%、其他 +10%、細節 +0%、人物 +15%
翻成白話:人物從加 25% 降到加 15%,大景從原本拉到加 25%。人物那一格,我只動了 10%。
結果出來,大景 45 張,人物 7 張。
那個拉著馬頭琴唱曲子的大姐呢?我騎車騎到快死掉、停在路邊幫自己拍的那張呢?怎麼一張都沒有?
我第一個反應是 CC 你是不是亂選一通。
然後我想起來,是我自己調的。
我只把人物往下動了 10%,人物就從洗版變成幾乎消失。同一批照片、同一套規則,中間只差那一個小數點。
CC 給的解釋讓我停下來想了一陣子:
這些照片的美學分數很集中,都擠在 0.5 到 0.8 之間,所以權重差 10% 會大幅翻轉選片。這代表光靠調權重是個不穩定的控制桿。
我記得我的邏輯:權重與分數,同樣的權重下,挑分數高的。
但如果分數都一樣好也一樣爛呢?分數區間這麼窄,權重乘一下就跨過好幾張照片的名次。
我調的不是偏好,是在洗牌。
補充一下前面提過的:Apple 的 Vision Framework 會幫照片打美學分數,範圍是負一到正一。
但一般人拍的旅遊照幾乎都落在中間偏上那一小段,真正的神作跟真正的爛片都很少。分母很窄,任何乘法都會被放大。
寫到這裡我才發現,我從頭到尾把權重想成配額。
它不是。權重是乘在分數上的。
每張照片先有一個美學分數,權重乘上去變成加權分數,所有照片照加權分數排隊,然後才套每日配額(當天照片數的 15%,最少 2 張、最多 8 張)跟同主題單日上限。
所以我調權重,調的是排隊順序,不是「大景分到幾個名額」。
算式長這樣:
加權分數 = (美學分數 + 1) × 權重
先加 1 是因為美學分數可能是負的,負數乘權重會愈乘愈小,方向會整個反掉。加 1 之後範圍變成 0 到 2,乘法才乖。
假設一張大景跟一張人物,Vision 給的分數一模一樣都是 0.70:
同分的兩張,排隊的時候大景站前面。
然後我反過來問了一個問題:人物照要拿幾分,才追得上同一批大景?
| 大景的分數 | 人物要拿到 | 要多拿 |
|---|---|---|
| 0.50 | 0.63 | 0.13 |
| 0.60 | 0.74 | 0.14 |
| 0.70 | 0.85 | 0.15 |
| 0.80 | 0.96 | 0.16 |
一張 0.70 分的大景,人物照要 0.85 分才追得上。而所有照片都擠在 0.5 到 0.8 之間,整個區間只有 0.3 分寬。要多拿 0.15 分,等於要跨過半個區間。
再看最後一列。大景 0.80 的話,人物要 0.96,那個分數根本不存在,沒有人的旅遊照拿得到 0.96。
這就是 45 比 7 的來源。不是 CC 亂選,是我那組權重在數學上等於跟人物照說:你要比大景好半個區間,才有資格進來。
還有一件事我也是這時候才看懂:最右邊那欄的差距是會變大的,0.13、0.14、0.15、0.16。乘法的特性是分數越高,同樣的權重差拉開越多。 在正常的分數分布下這很合理,但在「大家分數都差不多」的分布下,它就變成放大器。
我跟 CC 來回討論幾次,它給了三個比權重穩的做法。
一、旅程自適應權重。 自動精選開跑前,先統計這趟的主題分布,跟一組基準值比,用全域口味搭配阻尼公式修正,最多減 15%、最多加 30%。
白話說就是,不管這趟大景拍再多,它的權重最多就是基準的 1.3 倍;拍再少,也還有 0.85 倍。天花板跟地板都先釘死,中間才由阻尼決定。
蒙古大景拍了 65%,基準是 45%,照抄比例要加 44%,阻尼壓完只加 14%。這就是「不完全按拍照比重」。
注意這跟我手調的那個 25% 是兩件事,它們是相乘的兩層:全域口味是我對所有旅程的偏好,旅程修正只管這一趟。
二、重要人物加成。 認出橫跨多天出現的臉當同行者,我確認一次之後,他們出現的照片乘 1.03。只有 3%,有加分,但不會壓過別人。這個數字小得很刻意:讓爸媽或旅伴的照片多一點機會,但不會蓋過別人。
三、同主題單日上限。 一天同一個主題最多 5 張。這是硬規則,它管的是結果分布,所以自拍或大景再美再高分,也洗不了版。
阻尼這個詞從物理來的,就是避震器在做的事:輸入變大,輸出跟著變大,但變得比較少,而且有上限。
實際跑幾個數字,最右邊那欄才是真正用上的權重:
| 主題 | 這趟占比 | 基準 | 照抄比例 | 阻尼壓完 | 實際權重 | 誰決定的 |
|---|---|---|---|---|---|---|
| 大景(蒙古) | 65% | 45% | 1.44x | 1.14 | 1.14 | 阻尼 |
| 大景(都市旅行) | 20% | 45% | 0.44x | 0.75 | 0.85 | 地板接住 |
| 細節 | 30% | 15% | 2.00x | 1.27 | 1.27 | 阻尼 |
| 人物 | 5% | 15% | 0.33x | 0.68 | 0.85 | 地板接住 |
| 食物(蒙古,13 張) | 0.5% | 10% | 0.05x | 0.35 | 0.85 | 地板接住 |
地板和天花板不是對稱的。
地板 0.85 是硬性設定,一條線畫在那裡。阻尼算出多低都沒用,只要低於 0.85 就拉回 0.85。食物那列算出 0.35,直接被接住。
天花板那一側要過兩關。第一關是阻尼,占比再高也先往下壓一次,細節拍了基準的兩倍,壓完剩 1.27。第二關才是 1.30 的硬天花板,壓完還是超過的才會被擋在 1.30。
所以這張表五列裡,三列的答案是地板給的,兩列是阻尼給的,天花板一次都沒用上。
(順帶一提,食物那列「阻尼壓完」剛好也是 0.35,跟阻尼公式裡那個指數同一個數字,純屬巧合。)
最後一列最能說明那個上下限在幹嘛。蒙古整趟的食物拍得少,據說只拍了 13 張食物(怎麼可能),照抄比例的話食物權重要砍到剩 5%,等於「這趟不准出現食物照」。設了下限之後只砍 15%,那 13 張裡最好的一兩張還是有機會進故事書,整本才不會缺一整個面向。
這跟我先前拍板的覆蓋率是同個立場:五大主題都要盡量涵蓋,不是硬按比例分配。
還有一件事必須誠實講。我後來問 CC,阻尼那個係數是怎麼來的,答案是沒有推導,是挑出來的。照抄比例會加 44%,開根號會加 20%,挑的那個值加 14%,看起來剛好合理。
所以我整篇在講「權重是不穩定的控制桿」,而拿來壓住它的那個係數,本身也是憑手感挑的。
真正救命的其實不是那個係數,是外面那個「最多加三成、最少打八五折」的硬上限。
不但讓用戶自己挑每個主題的權重,還給他一組看得懂的選項:精選比例做成三檔預設選項(精簡 10%、標準 15%、豐富 25%),口味頁的權重從儀表改成滑桿,旁邊寫清楚兩者會疊加。
目的是讓常用的用戶有一套簡單易懂的方法挑照片,不用理解後面那三層在算什麼。
這個系列同步寫在我的部落格:yojuhsu.com/blog
前一篇:【Day17】我以外的人看到了什麼?
下一篇:【Day19】AI 叫我去刷卡?所以我找了第三方來檢查